package com.lvkedu.dataforward.util;

import org.apache.log4j.Logger;

import java.io.*;
import java.util.ArrayList;


public class FileUtils {

    public static Logger log = Logger.getLogger(FileUtils.class);

    /**
     * @param path    文件全路径
     * @param fileTxt 要写入的文本内容
     * @return
     * @function 根据全路径向磁盘写入文本, 写文件源文件后追加
     */
    public static boolean writeFile(String path, String fileTxt) {
        BufferedWriter bw = null;
        try {
            createNewFile(path);//根据全路径直接创建文件
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path, true)));
            bw.write(fileTxt);
            bw.newLine();
        } catch (Exception e) {
            log.error("写入文本错误：" + e.getMessage());
            e.printStackTrace();
            return false;
        } finally {
            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    return false;
                }
            }
        }
        return true;
    }


    /**
     * @param path    全路径
     * @param fileTxt 要写入的文本
     * @return
     * @function 根据全路径向磁盘写入文本, 写文件源文件后覆盖之前的文件
     */
    public static boolean writeFileClear(String path, String fileTxt) {
        BufferedWriter bw = null;
        try {
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path)));
            bw.write(fileTxt);
            bw.newLine();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 获取文件编码格式
     *
     * @param fileName
     * @return
     * @throws Exception
     */
    public static String getFileEncoding(String fileName) throws Exception {
        BufferedInputStream bin = new BufferedInputStream(new FileInputStream(fileName));
        int p = (bin.read() << 8) + bin.read();
        String code = null;
        switch (p) {
            case 0xefbb:
                code = "UTF-8";
                break;
            case 0xfffe:
                code = "Unicode";
                break;
            case 0xfeff:
                code = "UTF-16BE";
                break;
            default:
                code = "GBK";
        }

        return code;
    }


    /**
     * 复制文件
     *
     * @param sourceFile
     * @param targetFile
     * @throws IOException
     */
    public static void copyFile(File sourceFile, File targetFile) throws IOException {
        // 新建文件输入流并对它进行缓冲
        FileInputStream input = new FileInputStream(sourceFile);
        BufferedInputStream inBuff = new BufferedInputStream(input);
        // 新建文件输出流并对它进行缓冲
        FileOutputStream output = new FileOutputStream(targetFile);
        BufferedOutputStream outBuff = new BufferedOutputStream(output);
        // 缓冲数组
        byte[] b = new byte[1024 * 5];
        int len;
        while ((len = inBuff.read(b)) != -1) {
            outBuff.write(b, 0, len);
        }
        // 刷新此缓冲的输出流
        outBuff.flush();
        // 关闭流
        inBuff.close();
        outBuff.close();
        output.close();
        input.close();
    }

    /**
     * 复制文件夹
     *
     * @param sourceDir
     * @param targetDir
     * @throws IOException
     */
    public static void copyDirectiory(String sourceDir, String targetDir) throws IOException {
        // 新建目标目录
        (new File(targetDir)).mkdirs();
        // 获取源文件夹当前下的文件或目录
        File[] file = (new File(sourceDir)).listFiles();
        for (int i = 0; i < file.length; i++) {
            if (file[i].isFile()) {
                // 源文件
                File sourceFile = file[i];
                // 目标文件
                File targetFile = new File(new File(targetDir).getAbsolutePath() + File.separator + file[i].getName());
                if (sourceFile.getName().indexOf(".vax") < 0)
                    copyFile(sourceFile, targetFile);
            }
            if (file[i].isDirectory()) {
                // 准备复制的源文件夹
                String dir1 = sourceDir + "/" + file[i].getName();
                // 准备复制的目标文件夹
                String dir2 = targetDir + "/" + file[i].getName();
                copyDirectiory(dir1, dir2);
            }
        }
    }

    /**
     * 得到文件的扩展名
     *
     * @param f
     * @return
     */
    public static String getFileExtension(File f) {
        if (f != null) {
            String filename = f.getName();
            int i = filename.lastIndexOf('.');
            if (i > 0 && i < filename.length() - 1) {
                return filename.substring(i + 1).toLowerCase();
            }
        }
        return null;
    }

    /**
     * 得到文件名(排除文件扩展名)
     *
     * @param f
     * @return
     */
    public static String getFileNameWithoutExt(File f) {
        if (f != null) {
            String filename = f.getName();
            int i = filename.lastIndexOf('.');
            if (i > 0 && i < filename.length() - 1) {
                return filename.substring(0, i);
            }
        }
        return null;
    }

    /**
     * 改变文件的扩展名
     *
     * @param fileNM
     * @param ext
     * @return
     */
    public static String changeFileExt(String fileNM, String ext) {
        int i = fileNM.lastIndexOf('.');
        if (i >= 0)
            return (fileNM.substring(0, i) + ext);
        else
            return fileNM;
    }

    /**
     * 得到文件的全路径
     *
     * @param filePath
     * @return
     */
    public static String getFileNameWithFullPath(String filePath) {
        int i = filePath.lastIndexOf('/');
        int j = filePath.lastIndexOf("\\");
        int k;
        if (i >= j) {
            k = i;
        } else {
            k = j;
        }
        int n = filePath.lastIndexOf('.');
        if (n > 0) {
            return filePath.substring(k + 1, n);
        } else {
            return filePath.substring(k + 1);
        }
    }

    /**
     * 判断目录是否存在
     *
     * @param strDir
     * @return
     */
    public static boolean existsDirectory(String strDir) {
        File file = new File(strDir);
        return file.exists() && file.isDirectory();
    }

    /**
     * 判断文件是否存在
     *
     * @param strDir
     * @return
     */
    public static boolean existsFile(String strDir) {
        File file = new File(strDir);
        return file.exists();
    }

    /**
     * 强制创建目录
     *
     * @param strDir
     * @return
     */
    public static boolean forceDirectory(String strDir) {
        File file = new File(strDir);
        file.mkdirs();
        return existsDirectory(strDir);
    }

    /**
     * 得到文件的大小
     *
     * @param fileName
     * @return
     */
    public static int getFileSize(String fileName) {

        File file = new File(fileName);
        FileInputStream fis = null;
        int size = 0;
        try {
            fis = new FileInputStream(file);
            size = fis.available();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return size;
    }

    /**
     * @param path
     * @function 根据全路径 直接创建文件,"e:\\a\\b\\a.txt"
     * @author wuqifan 2017年11月15日
     */
    public static boolean createNewFile(String path) {
        File file = new File(path);
        // 判断文件是否存在，如果存在直接返回
        if (file.exists()) {
            return true;
        }
        try {
//			String[] lists = path.split("\\.");
//			int lastLength = lists[0].lastIndexOf("\\");
//			// 得到文件夹目录
//			String dir = lists[0].substring(0, lastLength);
            String dir = file.getParent();
            // 得到文件名称
            // String fileName=lists[0].substring(lastLength);
            // 得到路径e:\a\b之后,先创建文件夹
            if (createMultilayerFile(dir)) {
                File filePath = new File(path);
                if (!filePath.exists()) {
                    filePath.createNewFile();
                }
            }
        } catch (Exception e) {
            log.error("新建文件操作出错:error " + e.getMessage());
            e.printStackTrace();
            return false;
        }
        return true;
    }

    // 创建文件夹--多层
    public static boolean createMultilayerFile(String dir) {
        try {
            File dirPath = new File(dir);
            if (!dirPath.exists()) {
                dirPath.mkdirs();
            }
        } catch (Exception e) {
            System.out.println("创建多层目录操作出错: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
        return true;
    }

    // 创建文件夹--单层
    private static void createFile(String dir) {
        try {
            File dirPath = new File(dir);
            if (!dirPath.exists()) {
                dirPath.mkdir();
            }
        } catch (Exception e) {
            System.out.println("创建目录操作出错: " + e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * @param path
     * @return
     * @function 得到目录下的所有文件的名称
     * @author wuqifan
     * 2017年11月15日
     */
    public static ArrayList<String> getFileName(String path) {
        ArrayList<String> list = new ArrayList<String>();
        File f = new File(path);
        if (!f.exists()) {
            System.out.println(path + " not exists");
            return null;
        }
        File fa[] = f.listFiles();// 列出目录中的所有文件
        for (int i = 0; i < fa.length; i++) {
            File fs = fa[i];
            list.add(fs.getName());
            if (fs.isDirectory()) {
                System.out.println(fs.getName() + " [目录]");
            } else {
                System.out.println(fs.getName());
            }
        }
        return list;
    }

    /**
     * 删除文件（夹）
     *
     * @param file（夹）
     */
    public static void delete(File file) {
        if (!file.exists())
            return;
        if (file.isFile()) {
            file.delete();
        } else {
            for (File f : file.listFiles()) {
                delete(f);
            }
            file.delete();
        }
    }

    /**
     * 复制文件（夹）到一个目标文件夹
     *
     * @param resFile       源文件（夹）
     * @param objFolderFile 目标文件夹
     * @throws IOException 异常时抛出
     */
    public static void copy(File resFile, File objFolderFile) throws IOException {
        if (!resFile.exists())
            return;
        if (!objFolderFile.exists())
            objFolderFile.mkdirs();
        if (resFile.isFile()) {
            File objFile = new File(objFolderFile.getPath() + File.separator + resFile.getName());
            // 复制文件到目标地
            InputStream ins = new FileInputStream(resFile);
            FileOutputStream outs = new FileOutputStream(objFile);
            byte[] buffer = new byte[1024 * 512];
            int length;
            while ((length = ins.read(buffer)) != -1) {
                outs.write(buffer, 0, length);
            }
            ins.close();
            outs.flush();
            outs.close();
        } else {
            String objFolder = objFolderFile.getPath() + File.separator + resFile.getName();
            File _objFolderFile = new File(objFolder);
            _objFolderFile.mkdirs();
            for (File sf : resFile.listFiles()) {
                copy(sf, new File(objFolder));
            }
        }
    }

    /**
     * 将文件（夹）移动到令一个文件夹
     *
     * @param resFile       源文件（夹）
     * @param objFolderFile 目标文件夹
     * @throws IOException 异常时抛出
     */
    public static void move(String resFile, String objFolderFile) throws IOException {
        copy(new File(resFile), new File(objFolderFile));
        delete(new File(resFile));
    }


    public static void main(String[] args) {
        String path = "c:\\log_record\\lkdLog\\logger.log";
        //String path = "/data/logs/run_data/logger.log";
        File file = new File(path);
//		String[] lists = path.split("/.");
//		int lastLength = lists[0].lastIndexOf("/");
        //String dir = lists[0].substring(0, lastLength);
        String name = file.getName();
        String dir = file.getParent();
        System.out.println("name:" + name);
        System.out.println("dir:" + dir);
        //dir:c:\log_record\lkdLog
        //String path = "C:\\data";
        //String path = "/data/logs/run_data/logger.log";
        //createNewFile(path);

//		ArrayList<String> list = getFileName(path);
//		for (int i = 0; i < list.size(); i++) {
//			System.out.println(list.get(i));
//		}
    }
}